/**
 * 版权所有 2009-2012山东新北洋信息技术股份有限公司
 * 保留所有权利。
 */
package com.linyaonan.leetcode.easy._299;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *
 * 你正在和你的朋友玩 猜数字（Bulls and Cows）游戏：你写下一个数字让你的朋友猜。每次他猜测后，你给他一个提示，告诉他有多少位数字和确切位置都猜对了（称为“Bulls”, 公牛），有多少位数字猜对了但是位置不对（称为“Cows”, 奶牛）。你的朋友将会根据提示继续猜，直到猜出秘密数字。
 *
 * 请写出一个根据秘密数字和朋友的猜测数返回提示的函数，用 A 表示公牛，用 B 表示奶牛。
 *
 * 请注意秘密数字和朋友的猜测数都可能含有重复数字。
 *
 * 示例 1:
 *
 * 输入: secret = "1807", guess = "7810"
 *
 * 输出: "1A3B"
 *
 * 解释: 1 公牛和 3 奶牛。公牛是 8，奶牛是 0, 1 和 7。
 * 示例 2:
 *
 * 输入: secret = "1123", guess = "0111"
 *
 * 输出: "1A1B"
 *
 * 解释: 朋友猜测数中的第一个 1 是公牛，第二个或第三个 1 可被视为奶牛。
 * 说明: 你可以假设秘密数字和朋友的猜测数都只包含数字，并且它们的长度永远相等。
 *
 *
 * @ProjectName: leetcode
 * @Package: com.linyaonan.leetcode.easy._299
 * @ClassName: BullsAndCows
 * @Author: linyaonan
 * @Date: 2019/12/20 16:33
 */
public class BullsAndCows {

    public String getHint0(String secret, String guess) {
        if ((secret == null || "".equals(secret)) || (guess == null || "".equals(guess))) {
            return "0A0B";
        }
        int d = 0;
        int x = 0;
        Map<Character, Integer> map = new HashMap<>();
        List<Character> gList = new ArrayList<>();
        for (int i = 0; i < secret.toCharArray().length; i++) {
            Character s = secret.charAt(i);
            Character g = guess.charAt(i);
            if (secret.charAt(i) == guess.charAt(i)) {
                d++;
            } else {
                Integer count = map.get(s);
                if (count != null) {
                    map.put(s, count + 1);
                } else {
                    map.put(s, 1);
                }
                gList.add(g);
            }
        }
        for (Character s : gList) {
            Integer count = map.get(s);
            if (count != null && count != 0) {
                x++;
                map.put(s, --count);
            }
        }
        return d + "A" + x + "B";
    }


    public String getHint(String secret, String guess) {
        if ((secret == null || "".equals(secret)) || (guess == null || "".equals(guess))) {
            return "0A0B";
        }
        int d = 0;
        int x = 0;
        int[] l1 = new int[10];
        int[] l2 = new int[10];
        for (int i = 0; i < secret.toCharArray().length; i++) {
            int s = secret.charAt(i) - '0';
            int g = guess.charAt(i) - '0';
            if (s == g) {
                d++;
            } else {
                l1[s]++;
                l2[g]++;
            }
        }
        for (int i = 0; i < 10; i++) {
            x += Math.min(l1[i], l2[i]);
        }
        return d + "A" + x + "B";
    }

}
